class Solution {
    /**
    dp[i][0]=min(dp[i−1][1],dp[i−1][2])+costs[i][0]
    dp[i][1]=min(dp[i−1][0],dp[i−1][2])+costs[i][1]
    dp[i][2]=min(dp[i−1][0],dp[i−1][1])+costs[i][2]
     */
    public int minCost(int[][] costs) {
        if(costs == null || costs.length == 0) {
            return 0;
        }
        if(costs.length == 1) {
            return Math.min(Math.min(costs[0][0],costs[0][1]),costs[0][2]); 
        }
        int length = costs.length;
        int[] dp = new int[3];
        //记录下标0的三组价格
        for(int i = 0;i < 3;i++) {
            dp[i] = costs[0][i];
        }
        //一次遍历，从下标1 开始，对每一个下标---用当前价格--加上--除去当前下标的上一个价格，其他两个的最小值
        for(int i = 1;i < length;i++) {
            int[] dpNew = new int[3];
            for(int j = 0;j < 3;j++) {
                dpNew[j] = Math.min(dp[(j+1)%3],dp[(j+2)%3]) + costs[i][j];
            }
            dp = dpNew;
        }
        return Math.min(Math.min(dp[0],dp[1]),dp[2]);
    }
}